/*! \file InPerUsr.h
    \brief Modulo Percistencia Usuario.

   \\fazer comentarios valor
 */

#ifndef PerUsr
#define PerUsr

#ifdef PerUsr_Serv
#define ExtPU
#else
#define ExtPU extern
#endif

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "InVetBit.h"

#define ARQUIVO_PU "Usuario.txt"
#define NARQUIVO_PU "Usuario"
#define TAMANHOREG_PU 38
#define VARIAVELCONTROLE_PU '$'
#define EXTENCAO_PU ".txt"

/**
   \struct usuario_M
   \brief Essa e a estrutura que classifica o usario no contexto modulo de persistencia usuario variaveis
 */
struct usuario_M {
    char Cpf[12]; /**< Um vetor de caracteres com 11 posicoes que quarda o cpf do usuario */
    char Nome[16]; /**< Um vetor de caracteres com 15 posicoes que quarda o nome do usuario*/
    char Senha[5]; /**< Um vetor de caracteres com 4 posicoes que quarda a senha do usuario*/
    int NumerAlbum; /**< um inteiro que quarda o numero de albuns que um usuario tem*/
};

/*! \var typedef struct usuario_M User
    \brief Representacao do usuario no contexto Modulo Percistencia Usuario
 */
typedef struct usuario_M User_PU;

/*! \fn ExtPU int VerificaSenha_PU (char* CpfPass, char* SenhaPass)
    \brief Verificar a senha de um certo usuario e permirtir autentica�ao do mesmo.
    \param cpf_Pass o cpf do usuario a ser autenticado
    \param senha_Pass a senha digitada pela usuario
   \return Um int que retorna 0 se a senha e a mesma e coloca o numero de tentarivos erradas em 0.
   Se a senha nao e a mesma retorna o numero de tentativas errada e atulaiza esse numero.
   Se o usuario bloqueado retorna -1.
 */
ExtPU int VerificaSenha_PU(const char*, const char*);

/*! \fn ExtPU int BloqueiaUsuario_PU (char* cpf_Pass)
    \brief Responsavel por remover o bloqueio de um certo usuario.
    \param cpf_Pass O cpf do usuario a ser bloqueado.
   \return Um inteano que retorna se o usuario foi bloqueado com sucesso.
 */
ExtPU int BloqueiaUsuario_PU(const char* cpf_Pass);

/*! \fn ExtPU int LiberaUsuario_PU (char* cpf_Pass)
    \brief Responsavel pelo bloqueio de um certo usuario
    \param cpf_Pass O cpf do usuario a ser liberado.
   \return Um inteano que retorna se o usuario foi liberado com sucesso.
 */
ExtPU int LiberaUsuario_PU(const char*);

/*! \fn ExtPU User* PegaUser_PU (char* cpf_Pass)												//termina esse aqui
    \brief Responsavel por pegar usuario dado a cpf deste
    \param cpf_Pass O cpf do usuario a ser retornado.
   \return Uma struct Usuario com o dados do usuario com o cpf passado.
 */
ExtPU int ListaOsUsuariosBloqueados_PU(const char*);

/*! \fn ExtPU User* PegaUser_PU (char* cpf_Pass)
    \brief Responsavel por pegar usuario dado a cpf deste
    \param cpf_Pass O cpf do usuario a ser retornado.
   \return Uma struct Usuario com o dados do usuario com o cpf passado.
 */
ExtPU int PegaUser_PU(const char*, User_PU*);

/*! \fn ExtPU int AtualizaUser_PU (UserPU* usuaAtua_Pass)
    \brief Responsavel por atualizar os dados do usuario com os dados da struct que foi passada.
    \param Uma struct prechida com os novos dados do usuario.
   \return Um inteano que retorna verdadeiro se o usuario foi atualizado com sucesso, e falso se ouve falha no atualizar o arquivo.
 */
ExtPU int AtualizaUser_PU(User_PU*);

/*! \fn ExtPU int DeletaUser_PU (char* pc_cpf_Pass, char* pc_senha_Pass)
    \brief Responsavel por deletar o usuario do cpf passado por parametro.
    \param cpf_Pass O cpf do usuario a ser deletado.
   \param pc_senha_Pass A senha do usuario a ser deletado.
   \return Um inteano que retorna verdadeiro se o usuario foi deletado com sucesso, e falso se ouve falha ao deletar o arquivo.
 */
ExtPU int DeletaUser_PU(const char*/*, const char**/); //fazer com a verifica�ao de senha

/*! \fn ExtPF int AddAlbum_PU (char* cpf_Pass);
    \brief Responsavel por adionar um no numero de albuns pertencetes ao usuario.
    \param cpf_Pass O cpf do usuario a ser deletado.
   \return Um inteano que retorna verdadeiro se foi adicionado um album com sucesso, e falso se ouve falha no atualizar o arquivo.
 */
ExtPU int AddAlbum_PU(const char*);

/*! \fn ExtPU int AddUsuario_PU (User* NovoUsuar)
    \brief Cria uma nova conta de usu�rio, e a adiciona ao arquivo
    \param NovoUsuar uma struct User que ser� adicionado ao arquivo
    \return Retorna um int indicando o sucesso ou o n�o sucesso da opera��o
 */
ExtPU int AddUsuario_PU(User_PU* NovoUsuar);

/*! \fn ExtPF int RemovAlbum_PU (char* cpf_Pass);
    \brief Responsavel por remover um no numero de albuns pertencetes ao usuario
    \param cpf_Pass O cpf do usuario a ser deletado.
   \return Um inteano que retorna verdadeiro se foi removido um album  com sucesso, e falso se ouve falha no atualizar o arquivo.
 */
ExtPU int RemoveAlbum_PU(const char*);
#endif
